package com.yeung.actions;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import static com.yeung.actions.ServiceResult.SUCCESS;

/**
 * 处理dispatcher分发过来的请求
 */
@Controller
@RequestMapping("/test")
public class SpringMvcTest {

    /**
     * RequestMapping 指定可以处理哪些url请求
     * <p>
     * 类定义处: 提供初步的请求映射信息,仙姑低于web应用的根目录
     * 类方法处: 提供进一步细分的映射信息, 若的类定义处没有注解RequestMapping
     * 则方法出的标记的url相对于web应用的根目录
     *
     * @return
     */
    @RequestMapping("/testRequestMapping")
    public String testRequestMapping() {
        System.out.println("test RequestMapping");
        return SUCCESS;
    }

    /**
     * 指定方法请求类型为post
     *
     * @return
     */
    @RequestMapping(value = "/testMethod", method = RequestMethod.POST)
    public String testMethod() {
        System.out.println("testMethod");
        return SUCCESS;
    }

    /**
     * 利用params 和headers 进行一些参数的获取和判断(满足设置的,才能获取响应)
     * 用于过滤作用的较多(支持简单的表达式)
     *
     * @return
     */
    @RequestMapping(value = "/testParas", params = {"username", "age!=10"}
            , headers = {"Accept-Language=zn-CN,zh;q=0.8"})
    public String testParas() {
        System.out.println("    @RequestMapping(\"/testParas\")\n");
        return SUCCESS;
    }

    /**
     * 请求的url可以使用通配符
     * * 表示匹配名字的任意字符
     * ** 匹配多层路径
     * ? 匹配一个字符
     * user/* /createUser:匹配 /user/aaa/createUser 或者/user/bbb/createUser的请求
     * /user/** /createUser:匹配 /user/createUser 或者/user/aaa/bbb/createUser 等url
     * /user/createuser??: 匹配 /user/createuseraa或者/user/createuserbb等
     *
     * @return
     */
    @RequestMapping(value = "/*/testRegix")
    public String testRegix() {
        System.out.println("test regix");
        return SUCCESS;
    }

    /**
     * 返回自定义的视图
     *
     * @return
     */
    @RequestMapping("/testView")
    public String testView() {
        System.out.println("testView");
        return "helloView";
    }

    /**
     * 重定向
     *
     * @return
     */
    @RequestMapping("/testRedirect")
    public String testRedirect() {
        System.out.println("testRedirect");
        return "redirect:/helloView";
    }

    /**
     * 转发
     *
     * @return
     */
    @RequestMapping("/testForward")
    public String testForward() {
        System.out.println("testRedirect");
        return "forward:/helloView";
    }

    /**
     * @param binder
     * @InitBinder 注解的方法必须是无返回值的
     * 它在spring进行表单注入到bean对象之前调用,
     * 可以用来控制需要对哪些数据进行注入等一系列控制操作
     */
    @InitBinder
    public void controBind(WebDataBinder binder) {
        binder.setDisallowedFields("lastName");//不对lastName属性注入值

    }
}
